import bcrypt from 'bcrypt'
import { User } from '../models/user.js'
// 注册
async function register (req, res) {
  const { regid, password, tel, email } = req.body
  console.log(req.body)
  try {
    // 检查用户名是否已存在
    const existingUser = await User.findOne({ regid })
    if (existingUser) {
      return res.render("index", { username: existingUser.regid, message: "用户已存在" })
    }

    if (!/^1[3-9]\d{9}$/.test(tel)) {
      return res.render("index", { message: "手机格式错误" })
    }
    // 获取当前时间的日期对象
    const currentDate = new Date()

    // 格式化日期时间成 "yyyyMMddHHmmss"
    const formattedDateTime = currentDate.toISOString().slice(0, 19).replace(/[-:T]/g, "")

    // 生成一个随机数（0到99999之间）
    const random = Math.floor(Math.random() * 100000)

    // 将日期时间字符串和随机数拼接成一个长整型数
    const id = parseInt(formattedDateTime + random)
    // 对密码进行加密处理
    const hashedPassword = await bcrypt.hash(password, 10)
    await User.create({ id, regid, password: hashedPassword, tel, email })
    res.render("login")
  } catch (error) {
    console.error("注册用户发生异常:", error)
  }
}
// 登录
async function login (req, res) {
  try {
    console.log('req.body:', req.body)
    const { regid, password } = req.body
    const user = await User.findOne({ regid })
    console.log('user', user)
    if (!user) {
      return res.render("index", { message: "用户不存在" })
    }
    const isPasswordMatch = await bcrypt.compare(password, user.password)
    if (!isPasswordMatch) {
      return res.render("index", { message: "密码错误" })
    }
    // 设置会话
    req.session.user = {
      regid: user.regid ? user.regid : '',
      id: user.id ? user.id : '',
    }
    // 构造响应结果
    res.render("index", { id: user.id, username: user.regid, message: "已登入！欢迎" })
  } catch (error) {
    console.log('error', error)
    res.render("index", { message: "登录失败!" })
  }
}
// 获取用户信息
async function getUserInfo (req, res, id) {
  // 检查用户是否已登录
  if (!Object.keys(req.session.user).length) {
    return res.render("login")
  }
  try {
    console.log('id', id)
    console.log(req.session)
    const user = await User.findOne({ id }).lean()
    if (!user) {
      return res.status(404).json({ msg: '未找到用户' })
    }

    res.render('reset', { user })
  } catch (error) {
    console.error(error)
    res.status(500).json({ msg: '服务器错误' })
  }
}

async function updUser (req, res) {
  // 检查用户是否已登录
  if (!req.session.user || Object.keys(req.session.user).length === 0) {
    return res.render("login")
  }

  const { id, regid, password, tel, email } = req.body

  try {
    let user = await User.findOne({ id: id })
    if (!user) {
      return res.status(404).json({ msg: '用户未找到', code: 404 })
    }
    // 判断密码是否为哈希值
    const isHashed = password.length === 60 && (password.startsWith('$2b$') || password.startsWith('$2a$'))
    console.log('isHashed', isHashed)
    let isPasswordMatch = false

    if (isHashed) {
      // 如果密码已经是哈希值，直接与数据库中的密码进行比较
      isPasswordMatch = password === user.password
    } else {
      // 如果密码是明文，从数据库中获取用户的哈希密码，然后使用bcrypt.compare来比较匹配性
      try {
        isPasswordMatch = await bcrypt.compare(password, user.password)
      } catch (err) {
        console.log('Error comparing passwords:', err)
      }
    }

    let updatedFields = {
      regid,
      tel,
      email
    }

    if (!isPasswordMatch) {
      // 如果密码不匹配，说明这是一个新密码，需要进行哈希处理
      updatedFields.password = await bcrypt.hash(password, 10)
    }

    // 查找是否存在具有相同 regid 的用户（排除当前用户）
    const existingUser = await User.findOne({ regid, id: { $ne: id } })

    if (existingUser) {
      return res.status(409).json({ msg: `该用户名${ regid }已存在`, code: 500 })
    }

    // 更新用户
    const updatedUser = await User.findOneAndUpdate(
      { id: id },
      updatedFields,
      { new: true, runValidators: true }
    )

    if (!updatedUser) {
      return res.status(500).json({ msg: '更新用户失败', code: 500 })
    }

    // 更新成功, 重新登录
    res.render("login")
  } catch (error) {
    console.error(error)
    // 处理错误响应
    res.status(500).json({ msg: '服务器内部错误', error: error.message, code: 500 })
  }
}

export default {
  register, login, updUser, getUserInfo
}